package eu.runelord.programmers.java.karty;

import java.util.LinkedList;
import java.util.List;

/**
 * Klasa reprezentująca talię kart.
 * 
 * @author koziolek
 * 
 * @param <T>
 */
public abstract class Talia<T extends Karta> {

	/**
	 * Metoda zwraca listę kart w talii.
	 * 
	 * @return
	 */
	protected abstract List<T> getListaKart();

	/**
	 * Metoda zwraca pierwszą kartę z talii. Karta jest usuwana z talii.
	 * 
	 * @return jedna karta
	 */
	public Karta getJedna() {
		return getListaKart().remove(0);
	}

	/**
	 * Metoda zwraca jedną losową kartę z talii. Karta jest usuwana z talii.
	 * 
	 * @return jedna losowa karta.
	 */
	public Karta getJednaLosowo() {
		int los = (int) (Math.random() * getListaKart().size());
		return getListaKart().remove(los);
	}

	/**
	 * Metoda zwraca pewną zadaną ilość kart z początku talii. Karty są usuwane
	 * z talii.
	 * 
	 * @param ilosc
	 *            - liczba kart, które będą wybrane
	 * @return lista zwróconych kart
	 */
	public List<Karta> get(int ilosc) {
		List<Karta> karty = new LinkedList<Karta>();
		do {
			karty.add(getListaKart().remove(0));
		} while (ilosc > 0);
		return karty;
	}

	/**
	 * Metoda zwraca pewną zadaną ilość losowo wybranych kart z talii. Karty są usuwane.
	 * z talii.
	 * 
	 * @param ilosc
	 *            - liczba kart, które będą wybrane
	 * @return lista zwróconych kart
	 */
	public List<Karta> getLosowe(int ilosc) {
		List<Karta> karty = new LinkedList<Karta>();
		do {
			int los = (int) (Math.random() * getListaKart().size());
			karty.add(getListaKart().remove(los));
		} while (ilosc > 0);
		return karty;
	}
}
